export class TaskQueue {
    private queue: Array<{ task: () => Promise<any>, resolve: (value: any) => void, reject: (reason?: any) => void }> = []; // 任务队列
    private runningCount: number = 0; // 当前正在执行的任务数量
    private concurrency: number; // 最大并发数

    constructor(concurrency: number) {
        this.concurrency = concurrency;
    }

    // 添加任务到队列，并返回一个 Promise
    public addTask(task: () => Promise<any>): Promise<any> {
        return new Promise((resolve, reject) => {
            this.queue.push({ task, resolve, reject }); // 将任务和 resolve/reject 存入队列
            this.run(); // 尝试执行任务
        });
    }

    // 执行任务
    private async run(): Promise<void> {
        // 如果当前正在执行的任务数量达到最大并发数，或者队列为空，则退出
        while (this.runningCount < this.concurrency && this.queue.length > 0) {
            const { task, resolve, reject } = this.queue.shift()!; // 从队列中取出任务
            this.runningCount++; // 增加正在执行的任务数量

            task()
                .then((result) => {
                    resolve(result); // 任务成功时解析 Promise
                })
                .catch((error) => {
                    reject(error); // 任务失败时拒绝 Promise
                })
                .finally(() => {
                    this.runningCount--; // 任务完成后减少正在执行的任务数量
                    this.run(); // 继续执行下一个任务
                });
        }
    }
}